﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using MJM.Principal;
using System.DirectoryServices;
using System.Net;
using System.Text;
using MJM.SPP.EntidadesNegocio;
using MJM.SCA.EntidadesNegocio;

namespace wRegPadron.frmOpciones
{
    public partial class ucPassDominio : System.Web.UI.UserControl
    {
        public AudiService.wsAud_Acc servicio = new AudiService.wsAud_Acc();

        private String ObtieneIP()
        {
            string ipusuario = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
            if (ipusuario == null)
                ipusuario = "";
            return ipusuario;
        }

        private void InsertarLog(String prm2, String prm3, string parametros, int resultado, string excepcion)
        {
            LogTramiteEN objLogTramiteEN = new LogTramiteEN();
            string mes, dia;
            if (DateTime.Now.Month < 10)
                mes = "0" + DateTime.Now.Month.ToString();
            else mes = DateTime.Now.Month.ToString();

            if (DateTime.Now.Day < 10)
                dia = "0" + DateTime.Now.Day.ToString();
            else dia = DateTime.Now.Day.ToString();
            objLogTramiteEN.LOGAW_chFECMOD = DateTime.Now.Year.ToString() + mes + dia;
            objLogTramiteEN.LOGAW_chFECREG = DateTime.Now.ToShortDateString();
            objLogTramiteEN.LOGAW_chHORREG = DateTime.Now.ToShortTimeString();
            objLogTramiteEN.LOGAW_chIPCLIEN = ObtieneIP();
            objLogTramiteEN.LOGAW_chPARDOS = prm2;
            objLogTramiteEN.LOGAW_chPARUNO = Session["Usuario"].ToString();
            objLogTramiteEN.LOGAW_chPARTRE = prm3;
            objLogTramiteEN.LOGAW_inHORMOD = DateTime.Now.Hour;
            objLogTramiteEN.LOGAW_chNOMAPL = "Padrón";
            servicio.Inser_Acc(Session["Usuario"].ToString(), "Gestión", prm2, prm3, parametros, resultado, excepcion, ObtieneIP());
            //servicio.Inser_Acc(Session["Usuario"].ToString(), "Gestión", prm2, prm3, parametros, resultado, excepcion, "");
            //MediadorCN.GetLogTramite().Insertar(objLogTramiteEN);
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                hfIdElemento.Value = "";
            }
        }

        protected void btnBuscar_Click(object sender, ImageClickEventArgs e)
        {
            if (txtDNI.Text.Length == 8)
            {
                var lst = MediadorCN.GetPersonaTramite().ListarSinArea("", "", txtDNI.Text);
                if (lst.Count > 0)
                {
                    pDatos.Visible = true;
                    lblNombre.Text = lst[0].NombrePersona;
                    lblCorreo.Text = lst[0].Correo1;
                    lblUsuario.Text = lst[0].Usuario;
                    hfIdElemento.Value = lblUsuario.Text;
                }
                else
                {
                    pDatos.Visible = false;
                    lblErrorBusc.Text = "No se encontró el usuario";
                }
            }
            else
            {
                lblErrorBusc.Text = "Ingrese un DNI válido";
                pDatos.Visible = false;
            }
        }

        protected void btnAceptar_Click(object sender, EventArgs e)
        {
            if (hfIdElemento.Value != "")
            {
                ResetUserPassword();
                Servicio.wsMail mail = new Servicio.wsMail();
                mail.EnviaEmailFormatHTML(lblCorreo.Text, "Soporte", "Cambio de contraseña", "<table><tr><td>Estimado usuario " + lblNombre.Text + ",</td></tr><tr><td>Su contraseña ha sido modificada, con la finalidad de que pueda acceder al sistema.<br />Sus datos de ingreso son los siguientes:<br/>Usuario: " + lblUsuario.Text + "<br/>Contraseña: " + txtPass.Text + "<br/><br/>Atentamente, <br/>Sub Gerencia de Informática</td></tr></table>"); 
                lblErrorCambio.Text = "Cambio realizado correctamente.";
                InsertarLog("Cambio de contraseña", txtDNI.Text, lblUsuario.Text, 1, lblErrorCambio.Text);
            }
            else
            {
                lblErrorCambio.Text = "No se pudo realizar el cambio de contraseña.";
                InsertarLog("Cambio de contraseña",txtDNI.Text, lblUsuario.Text, 0, lblErrorCambio.Text);
            }
        }

        protected void ResetUserPassword()
        {
            try
            {
                var userDn = lblUsuario.Text;
                var pass = txtPass.Text;
                var directoryEntry = GetDirectoryEntryByUserName(userDn);
                directoryEntry.Invoke("SetPassword", new object[] { pass });
                directoryEntry.Properties["LockOutTime"].Value = 0;
                directoryEntry.Close();
            }
            catch (Exception ex)
            {
                lblErrorCambio.Text = ex.Message + " Lugar: " + ex.StackTrace.ToString();
            }
        }

        public DirectoryEntry GetDirectoryEntryByUserName(string userName)
        {
            var de = GetDirectoryObject(GetDomain());
            var deSearch = new DirectorySearcher(de) { SearchRoot = de, Filter = "(&(objectCategory=user)(samaccountname=" + userName + "))" };
            var results = deSearch.FindOne();
            return results != null ? results.GetDirectoryEntry() : null;
        }

        private DirectoryEntry GetDirectoryObject(string domainReference)
        {
            //string adminUser = "ccardenas";
            //string adminPassword = "20131366290";
            
            string adminUser = "adminuser";
            string adminPassword = "useradminhome";
            string fullPath = "LDAP://" + domainReference;

            var directoryEntry = new DirectoryEntry(fullPath, adminUser, adminPassword, AuthenticationTypes.Secure);
            
            return directoryEntry;
            
            /*
            DirectoryEntry ldapConnection = new DirectoryEntry("mjm.gob.pe");
            ldapConnection.Path = "LDAP://OU=munimjm,DC=mjm,DC=gob,DC=pe";
            ldapConnection.AuthenticationType = AuthenticationTypes.Secure;
            return ldapConnection;*/
        }

        private string GetDomain()
        {
            return "OU=munimjm,DC=mjm,DC=gob,DC=pe";
        }
    }
}